/**
 * Notes: 云函数业务主逻辑函数
 * Ver : CCMiniCloud Framework 2.7.1 ALL RIGHTS RESERVED BY cclinuX0730 (wechat)
 * Date: 2021-02-09 04:00:00 
 */

const appCode = require('./app_code.js');

function handlerBasic(code, msg = '', data = {}) {
	try {
		// 确保消息是字符串
		if (msg === null || msg === undefined) {
			msg = '';
		} else if (typeof msg !== 'string') {
			try {
				msg = String(msg);
			} catch (e) {
				console.error('消息格式化错误：', e);
				msg = '';
			}
		}

		// 确保数据是可序列化的
		if (data === null || data === undefined) {
			data = {};
		} else {
			try {
				// 递归处理对象，移除所有undefined、函数和循环引用
				const seen = new WeakSet();
				const sanitizeData = (obj) => {
					// 处理null或undefined
					if (obj === null || obj === undefined) {
						return null;
					}
					
					// 处理基本类型
					if (typeof obj !== 'object') {
						if (typeof obj === 'function') {
							return null;
						}
						if (typeof obj === 'undefined') {
							return null;
						}
						if (typeof obj === 'number' && (isNaN(obj) || !isFinite(obj))) {
							return 0;
						}
						if (typeof obj === 'symbol') {
							return null;
						}
						return obj;
					}
					
					// 检测循环引用
					if (seen.has(obj)) {
						return null; // 避免循环引用
					}
					seen.add(obj);
					
					// 处理数组
					if (Array.isArray(obj)) {
						return obj.map(item => sanitizeData(item)).filter(item => item !== null);
					}
					
					// 处理日期对象
					if (obj instanceof Date) {
						return obj.toISOString();
					}
					
					// 处理普通对象
					const result = {};
					for (const key in obj) {
						if (Object.prototype.hasOwnProperty.call(obj, key)) {
							const value = sanitizeData(obj[key]);
							if (value !== null) {
								result[key] = value;
							}
						}
					}
					return result;
				};
				
				// 应用净化处理
				data = sanitizeData(data);
				
				// 最后再通过JSON序列化确保安全
				data = JSON.parse(JSON.stringify(data));
			} catch (e) {
				console.error('数据序列化错误：', e);
				data = { error: '数据处理错误' };
			}
		}

		// 处理特定状态码的消息
		switch (code) {
			case appCode.SUCC:
				msg = (msg) ? msg + ':ok' : 'ok';
				break;
			case appCode.SVR:
				msg = '服务器繁忙，请稍后再试';
				break;
			case appCode.LOGIC:
				break;
			case appCode.DATA:
				break;
		}

		// 构建安全的返回对象
		const result = {
			code: code,
			msg: msg,
			data: data
		};

		// 最后再次确保返回值安全
		try {
			return JSON.parse(JSON.stringify(result));
		} catch (e) {
			console.error('最终结果序列化错误：', e);
			return {
				code: appCode.SVR,
				msg: '服务器繁忙，请稍后再试',
				data: {}
			};
		}
	} catch (mainError) {
		// 如果发生任何错误，确保返回有效对象
		console.error('handlerBasic函数错误：', mainError);
		return {
			code: appCode.SVR,
			msg: '服务器繁忙，请稍后再试',
			data: {}
		};
	}
}

function handlerSvrErr(msg = '') {
	return handlerBasic(appCode.SVR, msg);
}

function handlerSucc(msg = '') {
	return handlerBasic(appCode.SUCC, msg);
}

function handlerAppErr(msg = '', code = appCode.LOGIC) {
	return handlerBasic(code, msg);
}


function handlerData(data, msg = '') {
	return handlerBasic(appCode.SUCC, msg, data);
}

module.exports = {
	handlerBasic,
	handlerData,
	handlerSucc,
	handlerSvrErr,
	handlerAppErr
}